noinst_LTLIBRARIES =
+if HAVE_VULKAN
+gsk_private_vulan_source_h = \
+ gskvulkanrendererprivate.h
+gsk_private_vulkan_source_c = \
+ gskvulkanrenderer.c
+endif
+
gsk_public_source_h = \
gskenums.h \
gskrenderer.h \
gsktexture.h \
gsktypes.h
gsk_private_source_h = \
+ $(gsk_private_vulkan_source_h) \
gskcairorendererprivate.h \
gskdebugprivate.h \
gskgldriverprivate.h \
gskrendererprivate.h \
gskrendernodeprivate.h \
gskshaderbuilderprivate.h \
+ gskvulkanrendererprivate.h \
gsktextureprivate.h
gsk_public_source_c = \
gskrenderer.c \
gskrendernodeiter.c \
gsktexture.c
gsk_private_source_c = \
+ $(gsk_private_vulkan_source_c) \
gskcairorenderer.c \
gskdebug.c \
gskgldriver.c \
#ifdef GDK_WINDOWING_WAYLAND
#include <gdk/wayland/gdkwayland.h>
#endif
+#ifdef GDK_WINDOWING_VULKAN
+#include "gskvulkanrendererprivate.h"
+#endif
typedef struct
{
env_var_type = GSK_TYPE_CAIRO_RENDERER;
else if (g_ascii_strcasecmp (renderer_name, "opengl") == 0)
env_var_type = GSK_TYPE_GL_RENDERER;
+#ifdef GDK_WINDOWING_VULKAN
+ else if (g_ascii_strcasecmp (renderer_name, "vulkan") == 0)
+ env_var_type = GSK_TYPE_VULKAN_RENDERER;
+#endif
else
env_var_type = G_TYPE_INVALID;
}
--- /dev/null
+#include "config.h"
+
+#include "gskvulkanrendererprivate.h"
+
+#include "gskdebugprivate.h"
+#include "gskrendererprivate.h"
+#include "gskrendernodeiter.h"
+#include "gskrendernodeprivate.h"
+#include "gsktextureprivate.h"
+
+#ifdef G_ENABLE_DEBUG
+typedef struct {
+ GQuark cpu_time;
+ GQuark gpu_time;
+} ProfileTimers;
+#endif
+
+struct _GskVulkanRenderer
+{
+ GskRenderer parent_instance;
+
+ GdkVulkanContext *vulkan;
+#ifdef G_ENABLE_DEBUG
+ ProfileTimers profile_timers;
+#endif
+};
+
+struct _GskVulkanRendererClass
+{
+ GskRendererClass parent_class;
+};
+
+G_DEFINE_TYPE (GskVulkanRenderer, gsk_vulkan_renderer, GSK_TYPE_RENDERER)
+
+static gboolean
+gsk_vulkan_renderer_realize (GskRenderer *renderer,
+ GdkWindow *window,
+ GError **error)
+{
+ GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer);
+
+ self->vulkan = gdk_window_create_vulkan_context (window, error);
+ if (self->vulkan == NULL)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+gsk_vulkan_renderer_unrealize (GskRenderer *renderer)
+{
+ GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer);
+
+ g_clear_object (&self->vulkan);
+}
+
+static void
+gsk_vulkan_renderer_render (GskRenderer *renderer,
+ GskRenderNode *root)
+{
+ GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer);
+#ifdef G_ENABLE_DEBUG
+ GskProfiler *profiler;
+ gint64 cpu_time;
+#endif
+
+#ifdef G_ENABLE_DEBUG
+ profiler = gsk_renderer_get_profiler (renderer);
+ gsk_profiler_timer_begin (profiler, self->profile_timers.cpu_time);
+#endif
+
+#ifdef G_ENABLE_DEBUG
+ cpu_time = gsk_profiler_timer_end (profiler, self->profile_timers.cpu_time);
+ gsk_profiler_timer_set (profiler, self->profile_timers.cpu_time, cpu_time);
+
+ gsk_profiler_push_samples (profiler);
+#endif
+}
+
+static void
+gsk_vulkan_renderer_class_init (GskVulkanRendererClass *klass)
+{
+ GskRendererClass *renderer_class = GSK_RENDERER_CLASS (klass);
+
+ renderer_class->realize = gsk_vulkan_renderer_realize;
+ renderer_class->unrealize = gsk_vulkan_renderer_unrealize;
+ renderer_class->render = gsk_vulkan_renderer_render;
+}
+
+static void
+gsk_vulkan_renderer_init (GskVulkanRenderer *self)
+{
+#ifdef G_ENABLE_DEBUG
+ GskProfiler *profiler = gsk_renderer_get_profiler (GSK_RENDERER (self));
+
+ self->profile_timers.cpu_time = gsk_profiler_add_timer (profiler, "cpu-time", "CPU time", FALSE, TRUE);
+#endif
+}
--- /dev/null
+#ifndef __GSK_VULKAN_RENDERER_PRIVATE_H__
+#define __GSK_VULKAN_RENDERER_PRIVATE_H__
+
+#include <vulkan/vulkan.h>
+#include <gsk/gskrenderer.h>
+
+G_BEGIN_DECLS
+
+#define GSK_TYPE_VULKAN_RENDERER (gsk_vulkan_renderer_get_type ())
+
+#define GSK_VULKAN_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_VULKAN_RENDERER, GskVulkanRenderer))
+#define GSK_IS_VULKAN_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_VULKAN_RENDERER))
+#define GSK_VULKAN_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_VULKAN_RENDERER, GskVulkanRendererClass))
+#define GSK_IS_VULKAN_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_VULKAN_RENDERER))
+#define GSK_VULKAN_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_VULKAN_RENDERER, GskVulkanRendererClass))
+
+typedef struct _GskVulkanRenderer GskVulkanRenderer;
+typedef struct _GskVulkanRendererClass GskVulkanRendererClass;
+
+GType gsk_vulkan_renderer_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GSK_VULKAN_RENDERER_PRIVATE_H__ */